#ifndef MSGPARSE_H
#define MSGPARSE_H

#include <stdint.h>
#include <QDebug>
#include "datapack.h"
#include <QObject>

/* 0xFE	type	len	payload	sumH	sumL

	0xFE：1字节，固定消息头
	type：1字节，消息类型，具体定义见文档
	len：payload长度>127，len部分为2字节
        payload长度≤127，len部分为1字节
        len部分的第1个字节的最高位如果是1表示len是2字节（lenH在前，lenL在后）len = (lenH &0x7f)*128+ lenL，如果最高位如果是0则是1字节表示。
    例：payload长度为126（len就是1个字节，16进制0x7E）
        payload长度为130（len就是2个字节表示，lenH = 0x81, lenL = 0x02）
	payload：n字节（与len一致）），具体消息内容由type字段决定, 详见文档
	sumH：1字节， type + len +payload所有字节求和结果的高8位
	sumL：1字节， type + len +payload所有字节求和结果的低8位
*/
#define MSG_IDEL        0
#define MSG_HEAD        1   // 0xFE
#define MSG_MSGTYPE     2   // 消息类型
#define MSG_LEN         3	// MSG_PAYLOAD
#define MSG_PAYLOAD     4	// 消息内容
#define MSG_CKH         5
#define MSG_CKL         6

#define HEAD            0xFE



#define MSG_PORT_CONFIRM    0x01  // 端口确认
#define MSG_VERSION_REQ     0X02  // 版本信息查询
#define MSG_VERSION_REPLY   0X03  // 版本信息查询回复
#define MSG_LOAD_START      0X04  // 更新开始
#define MSG_FIRMWARE_REQ    0X05  // 请求指定固件包
#define MSG_FIRMWARE_REPLY  0X06  // 固件包下发
#define MSG_UPDATE_FINISH   0X07  // 更新完成
#define MSG_UPDATE_ERROR    0X08  // 更新出错

#define MSG_OUTPUT_DISABLE      0X10  // 关闭所有输出
#define MSG_OUTPUT_ENABLE       0X11  // 打开指定输出
#define MSG_ANGLE_COMPENSATION  0X12  // 角度补偿
#define MSG_BAUD_SET            0X13  // 波特率设置
#define MSG_MAG_CALIBRATION     0X14  // 开始校准磁力计
#define MSG_MAG_RAW             0X15  // 磁力计原始值
#define MSG_MAG_FILTER          0X16  // 磁力计校准后值
#define MSG_PARAM_GET           0X17  // 读取所有配置信息
#define MSG_PARAM_SET           0X18  // 设置所有配置信息
#define MSG_WIND_CALIBRATION    0x19  // 风向校准


#define START 	1
#define FINISH 	2



class MsgParse : public QObject
{
    Q_OBJECT
public:
    explicit MsgParse(QObject *parent = nullptr);

    uint8_t parsing(uint8_t data);
    void setIdel(void);
    uint8_t stat;  			// 接收消息状态机

signals:
    void parsingOk(uint8_t t,uint16_t l,QList<uint8_t> p,uint8_t ckh,uint8_t ckl);


};

#endif // MSG_H
